package com.aco.fatureapp.service;

import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import org.apache.http.NameValuePair;
import org.apache.http.message.BasicNameValuePair;

import android.annotation.SuppressLint;
import android.database.sqlite.SQLiteDatabase;
import br.com.ac.fatureweb.integration.enums.EnumSincronizacaoTabelas;

import com.aco.fatureapp.activity.ImportActivity.ImportAsyncTask;
import com.aco.fatureapp.enums.EnumProgress;
import com.aco.fatureapp.model.AnaliseAgua;
import com.aco.fatureapp.model.AvisoDebito;
import com.aco.fatureapp.model.ConfiguracaoCalculo;
import com.aco.fatureapp.model.ConfiguracaoSaae;
import com.aco.fatureapp.model.Debito;
import com.aco.fatureapp.model.Economia;
import com.aco.fatureapp.model.Faixa;
import com.aco.fatureapp.model.Historico;
import com.aco.fatureapp.model.Imovel;
import com.aco.fatureapp.model.LancamentoFuturo;
import com.aco.fatureapp.model.Mensagem;
import com.aco.fatureapp.model.Ocorrencia;
import com.aco.fatureapp.model.Roteiro;
import com.aco.fatureapp.model.RoteiroConfig;
import com.aco.fatureapp.model.SaldoDebitoCredito;
import com.aco.fatureapp.model.Tarifa;
import com.aco.fatureapp.model.TarifaSocial;
import com.aco.fatureapp.utilitary.JSonHttpRequest;
import com.aco.fatureapp.utilitary.JSonHttpRequest.EnumTipoRequisicao;
import com.aco.fatureapp.utilitary.Utils;
import com.google.inject.Inject;
import com.orm.SugarApp;
import com.orm.SugarDb;
import com.orm.SugarRecord;
import com.orm.query.Select;

@SuppressLint("UseSparseArrays")
public class SrvImportRoute {

	public static final String SEM_ROTEIRO_DISPONIVEL = ""
			+ "Não existe roteiro disponível para carga "
			+ "associado ao equipamento de IMEI nº: "
			+ Utils.getImei(SugarApp.getSugarContext());

	private JSonHttpRequest mJsonRequest = null;
	private List<NameValuePair> mParams = null;
	private SQLiteDatabase mDatabase = null;
	private ImportAsyncTask mTask = null;

	private Roteiro mRoteiro = null;

	@Inject
	private SrvMetering mSrvMetering;

	@Inject
	public SrvImportRoute() {
		super();
		this.mJsonRequest = new JSonHttpRequest();
	}

	public String execute(final List<NameValuePair> mParams,
			final ImportAsyncTask mTask) throws Exception {

		this.mDatabase = new SugarDb(SugarApp.getSugarContext())
				.getWritableDatabase();

		this.mTask = mTask;
		this.mParams = mParams;

		if (JSonHttpRequest
				.webServiceIsAvailable(JSonHttpRequest.REQUEST_TYPE_IMPORT)) {

			mTask.myPublishProgress(EnumProgress.INICIO.getType());

			if (hasRouteToLoad()) {

				SugarRecord.deleteAll(AnaliseAgua.class);
				importAnaliseAgua(2, EnumSincronizacaoTabelas.AnaliseAgua, 10);

				SugarRecord.deleteAll(AvisoDebito.class);
				importAvisoDebito(3, EnumSincronizacaoTabelas.AvisoDebito, 10);

				SugarRecord.deleteAll(ConfiguracaoCalculo.class);
				importConfiguracaoCalculo(4,
						EnumSincronizacaoTabelas.ConfiguracaoCalculo, 10);

				SugarRecord.deleteAll(ConfiguracaoSaae.class);
				importConfiguracaoSaae(5,
						EnumSincronizacaoTabelas.ConfiguracaoSaae, 10);

				SugarRecord.deleteAll(Debito.class);
				importDebito(6, EnumSincronizacaoTabelas.Debito, 10);

				SugarRecord.deleteAll(Economia.class);
				importEconomia(7, EnumSincronizacaoTabelas.Economia, 10);

				SugarRecord.deleteAll(Historico.class);
				importHistorico(8, EnumSincronizacaoTabelas.Historico, 30);

				SugarRecord.deleteAll(Imovel.class);
				importImovel(9, EnumSincronizacaoTabelas.Imovel, 30);

				SugarRecord.deleteAll(LancamentoFuturo.class);
				importLancamentoFuturo(10,
						EnumSincronizacaoTabelas.LancamentoFuturo, 30);

				SugarRecord.deleteAll(Mensagem.class);
				importMensagem(11, EnumSincronizacaoTabelas.Mensagem, 10);

				SugarRecord.deleteAll(Ocorrencia.class);
				importOcorrencia(12, EnumSincronizacaoTabelas.Ocorrencia, 10);

				SugarRecord.deleteAll(SaldoDebitoCredito.class);
				importSaldoDebitoCredito(13,
						EnumSincronizacaoTabelas.SaldoDebitoCredito, 10);

				SugarRecord.deleteAll(TarifaSocial.class);
				importTarifaSocial(14, EnumSincronizacaoTabelas.TarifaSocial,
						10);

				SugarRecord.deleteAll(Tarifa.class);
				importTarifa(15, EnumSincronizacaoTabelas.Tarifa, 10);

				SugarRecord.deleteAll(Faixa.class);
				importFaixa(16, EnumSincronizacaoTabelas.Faixa, 1);

				limparFaturamentoRoteiroAnterior();

				// Marcar roteiro como importado.
				marcarRoteiroEmCampo();

				liberarLeitura(mRoteiro.getIdIntegracao());

				mTask.myPublishProgress(EnumProgress.FIM.getType());

				return JSonHttpRequest.SYNC_SUCCESSFUL;
			}

			throw new Exception(SEM_ROTEIRO_DISPONIVEL);
		}

		throw new Exception(JSonHttpRequest.SERVICO_INDISPONIVEL);
	}

	private void limparFaturamentoRoteiroAnterior() {
		mSrvMetering.deleteAllBilling();
	}

	private void liberarLeitura(Long idRoteiro) {
		SugarRecord.deleteAll(RoteiroConfig.class);

		RoteiroConfig roteiroConfig = new RoteiroConfig();

		roteiroConfig.setNumero(idRoteiro);

		roteiroConfig.setLeituraLiberada(true);
		roteiroConfig.setCargaLiberada(false);
		roteiroConfig.setEncerrado(false);
		RoteiroConfig.saveInTx(roteiroConfig);
	}

	private void marcarRoteiroEmCampo() throws Exception {

		mJsonRequest.execute(JSonHttpRequest.getImportURL() + "marcarRoteiro",
				EnumTipoRequisicao.POST, mParams);
	}

	/**
	 *
	 */
	public void limparCarga() {
		SugarRecord.deleteAll(Roteiro.class);

		SugarRecord.deleteAll(AnaliseAgua.class);

		SugarRecord.deleteAll(AvisoDebito.class);

		SugarRecord.deleteAll(ConfiguracaoCalculo.class);

		SugarRecord.deleteAll(ConfiguracaoSaae.class);

		SugarRecord.deleteAll(Debito.class);

		SugarRecord.deleteAll(Economia.class);

		SugarRecord.deleteAll(Historico.class);

		SugarRecord.deleteAll(Imovel.class);

		SugarRecord.deleteAll(LancamentoFuturo.class);

		SugarRecord.deleteAll(Mensagem.class);

		SugarRecord.deleteAll(Ocorrencia.class);

		SugarRecord.deleteAll(SaldoDebitoCredito.class);

		SugarRecord.deleteAll(TarifaSocial.class);

		SugarRecord.deleteAll(Tarifa.class);

		SugarRecord.deleteAll(Faixa.class);
	}

	/**
	 * Verifica a existência de um roteiro disponível para carga, se sim realiza
	 * a carga do roteiro.
	 *
	 * @return
	 * @throws Exception
	 */
	private Boolean hasRouteToLoad() throws Exception {

		SugarRecord.deleteAll(Roteiro.class);

		importRoteiro(1, EnumSincronizacaoTabelas.Roteiro, 1);

		final Iterator<Roteiro> lstRoteiro = Roteiro.findAll(Roteiro.class);

		if (lstRoteiro != null && lstRoteiro.hasNext()) {

			final Roteiro roteiro = lstRoteiro.next();

			mRoteiro = roteiro;

			this.mParams.add(new BasicNameValuePair("seqRoteiro", roteiro
					.getIdIntegracao().toString()));

			this.mParams.add(new BasicNameValuePair("idRoteiro", roteiro
					.getIdIntegracao().toString()));

			return Boolean.TRUE;
		}

		return Boolean.FALSE;
	}

	public RoteiroConfig getRoteiroConfig() {

		List<RoteiroConfig> roteiroConfig = Select.from(RoteiroConfig.class)
				.list();

		if (roteiroConfig != null && !roteiroConfig.isEmpty()) {
			return roteiroConfig.iterator().next();
		}

		return null;
	}

	/**
	 *
	 * Carregando dados do roteiro a ser executado. O identificador do roteiro é
	 * necessário para a importação de todas as outras entidades.
	 *
	 * @param tabela
	 * @param nomeTabela
	 * @param qtdRefresh
	 * @throws Exception
	 */
	private void importRoteiro(final int tabela,
			final EnumSincronizacaoTabelas nomeTabela, final int qtdRefresh)
			throws Exception {

		final String sqlStament = " INSERT INTO "
				+ Roteiro.getTableName(Roteiro.class)
				+ " (id, id_integracao, numero, ordem, competencia, data_geracao, data_Faturamento, qtd_imovel)"
				+ " VALUES (?1, ?2, ?3, ?4, ?5, ?6, ?7,?8)";

		final Map<Integer, String> mapCampos = new HashMap<Integer, String>();

		mapCampos.put(2, "id");
		mapCampos.put(3, "numero");
		mapCampos.put(4, "ordem");
		mapCampos.put(5, "competencia");
		mapCampos.put(6, "dataGeracao");
		mapCampos.put(7, "dataFaturamento");
		mapCampos.put(8, "qtdImovel");

		mJsonRequest.execute(JSonHttpRequest.getImportURL() + "findRoteiro",
				EnumTipoRequisicao.POST, mParams, mDatabase, sqlStament,
				mapCampos, mTask, tabela, nomeTabela.getCodigo(), qtdRefresh);
	}

	private void importAnaliseAgua(final int tabela,
			final EnumSincronizacaoTabelas nomeTabela, final int qtdRefresh)
			throws Exception {

		final String sqlStament = " INSERT INTO "
				+ AnaliseAgua.getTableName(AnaliseAgua.class)
				+ " (id, id_integracao, codigo, descricao, data_coleta_inicio,"
				+ " data_coleta_final, mes, ano, texto1, texto2, texto3, texto4,"
				+ " texto5, texto6, coleta1, coleta2, coleta3, coleta4, coleta5,"
				+ " coleta6, qtd1, qtd2, qtd3, qtd4, qtd5, qtd6)"
				+ " VALUES (?1, ?2, ?3, ?4, ?5, ?6, ?7, ?8, ?9, ?10, ?11, ?12, ?13, ?14,"
				+ " ?15, ?16, ?17, ?18, ?19, ?20, ?21, ?22, ?23, ?24, ?25, ?26)";

		final Map<Integer, String> mapCampos = new HashMap<Integer, String>();

		mapCampos.put(2, "id");
		mapCampos.put(3, "codigo");
		mapCampos.put(4, "descricao");
		mapCampos.put(5, "dataColetaInicio");
		mapCampos.put(6, "dataColetaFinal");
		mapCampos.put(7, "mes");
		mapCampos.put(8, "ano");
		mapCampos.put(9, "texto1");
		mapCampos.put(10, "texto2");
		mapCampos.put(11, "texto3");
		mapCampos.put(12, "texto4");
		mapCampos.put(13, "texto5");
		mapCampos.put(14, "texto6");
		mapCampos.put(15, "coleta1");
		mapCampos.put(16, "coleta2");
		mapCampos.put(17, "coleta3");
		mapCampos.put(18, "coleta4");
		mapCampos.put(19, "coleta5");
		mapCampos.put(20, "coleta6");
		mapCampos.put(21, "qtd1");
		mapCampos.put(22, "qtd2");
		mapCampos.put(23, "qtd3");
		mapCampos.put(24, "qtd4");
		mapCampos.put(25, "qtd5");
		mapCampos.put(26, "qtd6");

		mJsonRequest.execute(
				JSonHttpRequest.getImportURL() + "findAnaliseAgua",
				EnumTipoRequisicao.POST, mParams, mDatabase, sqlStament,
				mapCampos, mTask, tabela, nomeTabela.getCodigo(), qtdRefresh);
	}

	private void importAvisoDebito(final int tabela,
			final EnumSincronizacaoTabelas nomeTabela, final int qtdRefresh)
			throws Exception {

		final String sqlStament = " INSERT INTO "
				+ AvisoDebito.getTableName(AvisoDebito.class)
				+ " (id, id_integracao, inscricao, numero, vencimento, codigo_barras, valor)"
				+ " VALUES (?1, ?2, ?3, ?4, ?5, ?6, ?7)";

		final Map<Integer, String> mapCampos = new HashMap<Integer, String>();

		mapCampos.put(2, "id");
		mapCampos.put(3, "inscricao");
		mapCampos.put(4, "numero");
		mapCampos.put(5, "vencimento");
		mapCampos.put(6, "codigoBarras");
		mapCampos.put(7, "valor");

		mJsonRequest.execute(
				JSonHttpRequest.getImportURL() + "findAvisoDebito",
				EnumTipoRequisicao.POST, mParams, mDatabase, sqlStament,
				mapCampos, mTask, tabela, nomeTabela.getCodigo(), qtdRefresh);
	}

	private void importConfiguracaoCalculo(final int tabela,
			final EnumSincronizacaoTabelas nomeTabela, final int qtdRefresh)
			throws Exception {

		final String sqlStament = " INSERT INTO "
				+ ConfiguracaoCalculo.getTableName(ConfiguracaoCalculo.class)
				+ " (id, id_integracao, pct_multa, pct_juros, val_minimo, flg_conshidro,"
				+ " csm_conshidro, des_conshidro, val_conshidro, flg_taxa1, csm_taxa1,"
				+ " des_taxa1, val_taxa1, flg_taxa2, csm_taxa2, des_taxa2, val_taxa2)"
				+ " VALUES (?1, ?2, ?3, ?4, ?5, ?6, ?7, ?8, ?9, ?10, ?11, ?12, ?13, ?14, ?15, ?16, ?17)";

		final Map<Integer, String> mapCampos = new HashMap<Integer, String>();

		mapCampos.put(2, "id");
		mapCampos.put(3, "pctMulta");
		mapCampos.put(4, "pctJuros");
		mapCampos.put(5, "valMinimo");
		mapCampos.put(6, "flgConshidro");
		mapCampos.put(7, "csmConshidro");
		mapCampos.put(8, "desConshidro");
		mapCampos.put(9, "valConshidro");
		mapCampos.put(10, "flgTaxa1");
		mapCampos.put(11, "csmTaxa1");
		mapCampos.put(12, "desTaxa1");
		mapCampos.put(13, "valTaxa1");
		mapCampos.put(14, "flgTaxa2");
		mapCampos.put(15, "csmTaxa2");
		mapCampos.put(16, "desTaxa2");
		mapCampos.put(17, "valTaxa2");

		mJsonRequest.execute(JSonHttpRequest.getImportURL()
				+ "findConfiguracaoCalculo", EnumTipoRequisicao.POST, mParams,
				mDatabase, sqlStament, mapCampos, mTask, tabela,
				nomeTabela.getCodigo(), qtdRefresh);
	}

	private void importConfiguracaoSaae(final int tabela,
			final EnumSincronizacaoTabelas nomeTabela, final int qtdRefresh)
			throws Exception {

		final String sqlStament = " INSERT INTO "
				+ ConfiguracaoSaae.getTableName(ConfiguracaoSaae.class)
				+ " (id, id_integracao, cid_cliente, unf_cliente, sigla_cliente,"
				+ " data_remessa, hora_remessa, exibir_leitura_anterior,"
				+ " exibir_ocorrencia_anterior, fat_conszerado,"
				+ " percentual_variacao_leitura, oculta_csmsemhidro)"
				+ " VALUES (?1, ?2, ?3, ?4, ?5, ?6, ?7, ?8, ?9, ?10, ?11, ?12)";

		final Map<Integer, String> mapCampos = new HashMap<Integer, String>();

		mapCampos.put(2, "id");
		mapCampos.put(3, "cidCliente");
		mapCampos.put(4, "unfCliente");
		mapCampos.put(5, "siglaCliente");
		mapCampos.put(6, "dataRemessa");
		mapCampos.put(7, "horaRemessa");
		mapCampos.put(8, "exibirLeituraAnterior");
		mapCampos.put(9, "exibirOcorrenciaAnterior");
		mapCampos.put(10, "fatConszerado");
		mapCampos.put(11, "percentualVariacaoLeitura");
		mapCampos.put(12, "ocultaCsmsemhidro");

		mJsonRequest.execute(JSonHttpRequest.getImportURL()
				+ "findConfiguracaoSaae", EnumTipoRequisicao.POST, mParams,
				mDatabase, sqlStament, mapCampos, mTask, tabela,
				nomeTabela.getCodigo(), qtdRefresh);
	}

	private void importDebito(final int tabela,
			final EnumSincronizacaoTabelas nomeTabela, final int qtdRefresh)
			throws Exception {

		final String sqlStament = " INSERT INTO "
				+ Debito.getTableName(Debito.class)
				+ " (id, id_integracao, inscricao, numero_fatura,"
				+ " competencia, vencimento, valor)"
				+ " VALUES (?1, ?2, ?3, ?4, ?5, ?6, ?7)";

		final Map<Integer, String> mapCampos = new HashMap<Integer, String>();

		mapCampos.put(2, "id");
		mapCampos.put(3, "inscricao");
		mapCampos.put(4, "numeroFatura");
		mapCampos.put(5, "competencia");
		mapCampos.put(6, "vencimento");
		mapCampos.put(7, "valor");

		mJsonRequest.execute(JSonHttpRequest.getImportURL() + "findDebito",
				EnumTipoRequisicao.POST, mParams, mDatabase, sqlStament,
				mapCampos, mTask, tabela, nomeTabela.getCodigo(), qtdRefresh);
	}

	private void importEconomia(final int tabela,
			final EnumSincronizacaoTabelas nomeTabela, final int qtdRefresh)
			throws Exception {

		final String sqlStament = " INSERT INTO "
				+ Economia.getTableName(Economia.class)
				+ "  (id, id_integracao, inscricao, cod_tarifa, qtd_economias)"
				+ " VALUES (?1, ?2, ?3, ?4, ?5)";

		final Map<Integer, String> mapCampos = new HashMap<Integer, String>();

		mapCampos.put(2, "id");
		mapCampos.put(3, "inscricao");
		mapCampos.put(4, "codTarifa");
		mapCampos.put(5, "qtdEconomias");

		mJsonRequest.execute(JSonHttpRequest.getImportURL() + "findEconomia",
				EnumTipoRequisicao.POST, mParams, mDatabase, sqlStament,
				mapCampos, mTask, tabela, nomeTabela.getCodigo(), qtdRefresh);
	}

	private void importHistorico(final int tabela,
			final EnumSincronizacaoTabelas nomeTabela, final int qtdRefresh)
			throws Exception {

		final String sqlStament = " INSERT INTO "
				+ Historico.getTableName(Historico.class)
				+ " (id, id_integracao, inscricao, "
				+ " mes1, ano1, ultimo_consumo1, ultima_ocorrencia1, dias_consumo1,"
				+ " mes2, ano2, ultimo_consumo2, ultima_ocorrencia2, dias_consumo2,"
				+ " mes3, ano3, ultimo_consumo3, ultima_ocorrencia3, dias_consumo3,"
				+ " mes4, ano4, ultimo_consumo4, ultima_ocorrencia4, dias_consumo4,"
				+ " mes5, ano5, ultimo_consumo5, ultima_ocorrencia5, dias_consumo5,"
				+ " mes6, ano6, ultimo_consumo6, ultima_ocorrencia6, dias_consumo6)"
				+ " VALUES (?1, ?2, ?3, ?4, ?5, ?6, ?7, ?8, ?9, ?10,"
				+ " ?11, ?12, ?13, ?14, ?15, ?16, ?17, ?18, ?19, ?20,"
				+ " ?21, ?22, ?23, ?24, ?25, ?26, ?27, ?28, ?29, ?30,"
				+ " ?31, ?32, ?33)";

		final Map<Integer, String> mapCampos = new HashMap<Integer, String>();

		mapCampos.put(2, "id");
		mapCampos.put(3, "inscricao");
		mapCampos.put(4, "mes1");
		mapCampos.put(5, "ano1");
		mapCampos.put(6, "ultimoConsumo1");
		mapCampos.put(7, "ultimaOcorrencia1");
		mapCampos.put(8, "diasConsumo1");
		mapCampos.put(9, "mes2");
		mapCampos.put(10, "ano2");
		mapCampos.put(11, "ultimoConsumo2");
		mapCampos.put(12, "ultimaOcorrencia2");
		mapCampos.put(13, "diasConsumo2");
		mapCampos.put(14, "mes3");
		mapCampos.put(15, "ano3");
		mapCampos.put(16, "ultimoConsumo3");
		mapCampos.put(17, "ultimaOcorrencia3");
		mapCampos.put(18, "diasConsumo3");
		mapCampos.put(19, "mes4");
		mapCampos.put(20, "ano4");
		mapCampos.put(21, "ultimoConsumo4");
		mapCampos.put(22, "ultimaOcorrencia4");
		mapCampos.put(23, "diasConsumo4");
		mapCampos.put(24, "mes5");
		mapCampos.put(25, "ano5");
		mapCampos.put(26, "ultimoConsumo5");
		mapCampos.put(27, "ultimaOcorrencia5");
		mapCampos.put(28, "diasConsumo5");
		mapCampos.put(29, "mes6");
		mapCampos.put(30, "ano6");
		mapCampos.put(31, "ultimoConsumo6");
		mapCampos.put(32, "ultimaOcorrencia6");
		mapCampos.put(33, "diasConsumo6");

		mJsonRequest.execute(JSonHttpRequest.getImportURL() + "findHistorico",
				EnumTipoRequisicao.POST, mParams, mDatabase, sqlStament,
				mapCampos, mTask, tabela, nomeTabela.getCodigo(), qtdRefresh);
	}

	private void importImovel(final int tabela,
			final EnumSincronizacaoTabelas nomeTabela, final int qtdRefresh)
			throws Exception {

		final String sqlStament = " INSERT INTO "
				+ Imovel.getTableName(Imovel.class)
				+ " (id, id_integracao, id_carga, inscricao, mes, ano, cod_localidade,"
				+ " cod_distrito, cod_setor, ordem_roteiro, nome_responsavel,"
				+ " cpfcnpj, rua, numero, complemento, bairro, cidade, uf, cep,"
				+ " categoria, classe, tarifa, tem_hidrometro, numero_hidrometro,"
				+ " data_instalacao_hidrometro, consumo_medio, leitura_anterior,"
				+ " ocorrencia_anterior, data_leitura_anterior, cod_reservatorio,"
				+ " flg_fatura_agua, flg_fatura_esgoto, percentual_esgoto,"
				+ " isento_conshid, isento_taxa1, isento_taxa2, flg_emitir_conta,"
				+ " situacao, agrupadora, flg_debito_em_conta, meses_debito,"
				+ " data_proxima_leitura, data_vencimento, numero_fatura,"
				+ " codigo_barras)"
				+ " VALUES (?1, ?2, ?3, ?4, ?5, ?6, ?7, ?8, ?9, ?10,"
				+ " ?11, ?12, ?13, ?14, ?15, ?16, ?17, ?18, ?19, ?20,"
				+ " ?21, ?22, ?23, ?24, ?25, ?26, ?27, ?28, ?29, ?30,"
				+ " ?31, ?32, ?33, ?34, ?35, ?36, ?37, ?38, ?39, ?40,"
				+ " ?41, ?42, ?43, ?44, ?45)";

		final Map<Integer, String> mapCampos = new HashMap<Integer, String>();

		mapCampos.put(2, "id");
		mapCampos.put(3, "idCarga");
		mapCampos.put(4, "inscricao");
		mapCampos.put(5, "mes");
		mapCampos.put(6, "ano");
		mapCampos.put(7, "codLocalidade");
		mapCampos.put(8, "codDistrito");
		mapCampos.put(9, "codSetor");
		mapCampos.put(10, "ordemRoteiro");
		mapCampos.put(11, "nomeResponsavel");
		mapCampos.put(12, "cpfcnpj");
		mapCampos.put(13, "rua");
		mapCampos.put(14, "numero");
		mapCampos.put(15, "complemento");
		mapCampos.put(16, "bairro");
		mapCampos.put(17, "cidade");
		mapCampos.put(18, "uf");
		mapCampos.put(19, "cep");
		mapCampos.put(20, "categoria");
		mapCampos.put(21, "classe");
		mapCampos.put(22, "tarifa");
		mapCampos.put(23, "temHidrometro");
		mapCampos.put(24, "numeroHidrometro");
		mapCampos.put(25, "dataInstalacaoHidrometro");
		mapCampos.put(26, "consumoMedio");
		mapCampos.put(27, "leituraAnterior");
		mapCampos.put(28, "ocorrenciaAnterior");
		mapCampos.put(29, "dataLeituraAnterior");
		mapCampos.put(30, "codReservatorio");
		mapCampos.put(31, "flgFaturaAgua");
		mapCampos.put(32, "flgFaturaEsgoto");
		mapCampos.put(33, "percentualEsgoto");
		mapCampos.put(34, "isentoConshid");
		mapCampos.put(35, "isentoTaxa1");
		mapCampos.put(36, "isentoTaxa2");
		mapCampos.put(37, "flgEmitirConta");
		mapCampos.put(38, "situacao");
		mapCampos.put(39, "agrupadora");
		mapCampos.put(40, "flgDebitoEmConta");
		mapCampos.put(41, "mesesDebito");
		mapCampos.put(42, "dataProximaLeitura");
		mapCampos.put(43, "dataVencimento");
		mapCampos.put(44, "numeroFatura");
		mapCampos.put(45, "codigoBarras");

		mJsonRequest.execute(JSonHttpRequest.getImportURL() + "findImovel",
				EnumTipoRequisicao.POST, mParams, mDatabase, sqlStament,
				mapCampos, mTask, tabela, nomeTabela.getCodigo(), qtdRefresh);
	}

	private void importLancamentoFuturo(final int tabela,
			final EnumSincronizacaoTabelas nomeTabela, final int qtdRefresh)
			throws Exception {

		final String sqlStament = " INSERT INTO "
				+ LancamentoFuturo.getTableName(LancamentoFuturo.class)
				+ " (id, id_integracao, inscricao, cod_servico, descricao, valor, parcela)"
				+ " VALUES (?1, ?2, ?3, ?4, ?5, ?6, ?7)";

		final Map<Integer, String> mapCampos = new HashMap<Integer, String>();

		mapCampos.put(2, "id");
		mapCampos.put(3, "inscricao");
		mapCampos.put(4, "codServico");
		mapCampos.put(5, "descricao");
		mapCampos.put(6, "valor");
		mapCampos.put(7, "parcela");

		mJsonRequest.execute(JSonHttpRequest.getImportURL()
				+ "findLancamentoFuturo", EnumTipoRequisicao.POST, mParams,
				mDatabase, sqlStament, mapCampos, mTask, tabela,
				nomeTabela.getCodigo(), qtdRefresh);
	}

	private void importMensagem(final int tabela,
			final EnumSincronizacaoTabelas nomeTabela, final int qtdRefresh)
			throws Exception {

		final String sqlStament = " INSERT INTO "
				+ Mensagem.getTableName(Mensagem.class)
				+ " (id, id_integracao, tip_mensagem, codigo, linha1,"
				+ " linha2, linha3, linha4, linha5, linha6, linha7, linha8)"
				+ " VALUES (?1, ?2, ?3, ?4, ?5, ?6, ?7, ?8, ?9, ?10, ?11, ?12)";

		final Map<Integer, String> mapCampos = new HashMap<Integer, String>();

		mapCampos.put(2, "id");
		mapCampos.put(3, "tipMensagem");
		mapCampos.put(4, "codigo");
		mapCampos.put(5, "linha1");
		mapCampos.put(6, "linha2");
		mapCampos.put(7, "linha3");
		mapCampos.put(8, "linha4");
		mapCampos.put(9, "linha5");
		mapCampos.put(10, "linha6");
		mapCampos.put(11, "linha7");
		mapCampos.put(12, "linha8");

		mJsonRequest.execute(JSonHttpRequest.getImportURL() + "findMensagem",
				EnumTipoRequisicao.POST, mParams, mDatabase, sqlStament,
				mapCampos, mTask, tabela, nomeTabela.getCodigo(), qtdRefresh);
	}

	private void importOcorrencia(final int tabela,
			final EnumSincronizacaoTabelas nomeTabela, final int qtdRefresh)
			throws Exception {

		final String sqlStament = " INSERT INTO "
				+ Ocorrencia.getTableName(Ocorrencia.class)
				+ " (id, id_integracao, codigo, descricao, flg_ocorrencia,"
				+ " flg_tipo_cobranca, flg_emitir_conta)"
				+ " VALUES (?1, ?2, ?3, ?4, ?5, ?6, ?7)";

		final Map<Integer, String> mapCampos = new HashMap<Integer, String>();

		mapCampos.put(2, "id");
		mapCampos.put(3, "codigo");
		mapCampos.put(4, "descricao");
		mapCampos.put(5, "flgOcorrencia");
		mapCampos.put(6, "flgTipoCobranca");
		mapCampos.put(7, "flgEmitirConta");

		mJsonRequest.execute(JSonHttpRequest.getImportURL() + "findOcorrencia",
				EnumTipoRequisicao.POST, mParams, mDatabase, sqlStament,
				mapCampos, mTask, tabela, nomeTabela.getCodigo(), qtdRefresh);
	}

	private void importSaldoDebitoCredito(final int tabela,
			final EnumSincronizacaoTabelas nomeTabela, final int qtdRefresh)
			throws Exception {

		final String sqlStament = " INSERT INTO "
				+ SaldoDebitoCredito.getTableName(SaldoDebitoCredito.class)
				+ " (id, id_integracao, inscricao, tipo, consumo)"
				+ " VALUES (?1, ?2, ?3, ?4, ?5)";

		final Map<Integer, String> mapCampos = new HashMap<Integer, String>();

		mapCampos.put(2, "id");
		mapCampos.put(3, "inscricao");
		mapCampos.put(4, "tipo");
		mapCampos.put(5, "consumo");

		mJsonRequest.execute(JSonHttpRequest.getImportURL()
				+ "findSaldoDebitoCredito", EnumTipoRequisicao.POST, mParams,
				mDatabase, sqlStament, mapCampos, mTask, tabela,
				nomeTabela.getCodigo(), qtdRefresh);
	}

	private void importTarifaSocial(final int tabela,
			final EnumSincronizacaoTabelas nomeTabela, final int qtdRefresh)
			throws Exception {

		final String sqlStament = " INSERT INTO "
				+ TarifaSocial.getTableName(TarifaSocial.class)
				+ " (id, id_integracao, inscricao, consumo_minimo, codigo_tarifa_social)"
				+ " VALUES (?1, ?2, ?3, ?4, ?5)";

		final Map<Integer, String> mapCampos = new HashMap<Integer, String>();

		mapCampos.put(2, "id");
		mapCampos.put(3, "inscricao");
		mapCampos.put(4, "consumoMinimo");
		mapCampos.put(5, "codigoTarifaSocial");

		mJsonRequest.execute(JSonHttpRequest.getImportURL()
				+ "findTarifaSocial", EnumTipoRequisicao.POST, mParams,
				mDatabase, sqlStament, mapCampos, mTask, tabela,
				nomeTabela.getCodigo(), qtdRefresh);
	}

	private void importTarifa(final int tabela,
			final EnumSincronizacaoTabelas nomeTabela, final int qtdRefresh)
			throws Exception {

		final String sqlStament = " INSERT INTO "
				+ Tarifa.getTableName(Tarifa.class)
				+ " (id, id_integracao, codigo, ano, mes, valor_fixo,"
				+ " valor_semhidro, sigla)"
				+ " VALUES (?1, ?2, ?3, ?4, ?5, ?6, ?7, ?8)";

		final Map<Integer, String> mapCampos = new HashMap<Integer, String>();

		mapCampos.put(2, "id");
		mapCampos.put(3, "codigo");
		mapCampos.put(4, "ano");
		mapCampos.put(5, "mes");
		mapCampos.put(6, "valorFixo");
		mapCampos.put(7, "valorSemhidro");
		mapCampos.put(8, "sigla");

		mJsonRequest.execute(JSonHttpRequest.getImportURL() + "findTarifa",
				EnumTipoRequisicao.POST, mParams, mDatabase, sqlStament,
				mapCampos, mTask, tabela, nomeTabela.getCodigo(), qtdRefresh);
	}

	private void importFaixa(final int tabela,
			final EnumSincronizacaoTabelas nomeTabela, final int qtdRefresh)
			throws Exception {

		final String sqlStament = " INSERT INTO "
				+ Faixa.getTableName(Faixa.class)
				+ " (id, id_integracao, inicio, fim,"
				+ " valor, cobranca_maxima, cod_tarifa)"
				+ " VALUES (?1, ?2, ?3, ?4, ?5, ?6, ?7)";

		final Map<Integer, String> mapCampos = new HashMap<Integer, String>();

		mapCampos.put(2, "id");
		mapCampos.put(3, "inicio");
		mapCampos.put(4, "fim");
		mapCampos.put(5, "valor");
		mapCampos.put(6, "cobrancaMaxima");
		mapCampos.put(7, "codTarifa");

		mJsonRequest.execute(JSonHttpRequest.getImportURL() + "findFaixa",
				EnumTipoRequisicao.POST, mParams, mDatabase, sqlStament,
				mapCampos, mTask, tabela, nomeTabela.getCodigo(), qtdRefresh);
	}

	/**
	 * Método responsável por fechar a conexão com a base de dados.
	 */
	public void closeDB() {

		if (mDatabase != null) {
			mDatabase.close();
		}
	}

	/**
	 * Verificar se a carga está liberada ou não.
	 *
	 * @return
	 */
	public boolean isCargaLiberada() {
		RoteiroConfig roteiroConfig = getRoteiroConfig();

		if (roteiroConfig != null) {
			return roteiroConfig.isCargaLiberada();
		}

		return true;
	}
}